package com.treeroot.treenet.protocol.abs.tcp.decode;

import com.treeroot.treenet.enums.TcpEncodingType;

import java.nio.ByteBuffer;

/**
 * Description: 默认消息解码器--默认解码器实现
 * Create By TreeRoot
 * Create Time: 2025/06/02 07:55
 * Class Name: DefaultMessageDecoder
 * <p>
 * 增强：支持 JSON 类型时自动提取 type 字段，若不存在则默认为 PING
 * 仅对 Encoding == 0x03 (JSON) 时生效
 *
 * @author TreeRoot
 */
public class DefaultMessageDecoder implements MessageDecoder {

    //private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public DecodedMessage decode(ByteBuffer buffer) {
        // 需要至少 8 字节（魔数2 + 版本1 + 编码1 + 长度4）
        if (buffer.remaining() < 8) {
            return null;
        }

        buffer.mark();

        short magic = buffer.getShort();
        if (magic != (short) 0xCAFE) {
            // 非法魔数，跳过一个字节
            buffer.reset();
            // 丢弃一个字节
            buffer.get();
            // 继续等待下一轮解码
            return null;
        }

        if (buffer.remaining() < 6) {
            // 版本、编码、长度还没读完，等待更多数据
            buffer.reset();
            return null;
        }

        byte version = buffer.get();
        byte encoding = buffer.get();
        int length = buffer.getInt();
        TcpEncodingType encodingType;

        try {
            encodingType = TcpEncodingType.fromCode(encoding);
        } catch (IllegalArgumentException e) {
            // 编码类型未知，丢弃本条数据，或者根据需求关闭连接
            buffer.clear();
            throw e;
        }

        if (length < 0 || length > buffer.capacity()) {
            // 长度异常，清空缓存重来
            buffer.clear();
            throw new IllegalArgumentException("payload长度异常: " + length);
        }

        if (buffer.remaining() < length) {
            // 负载不完整，重置等待
            buffer.reset();
            return null;
        }

        byte[] payload = new byte[length];
        buffer.get(payload);

        String payloadStr = new String(payload, encodingType.getCharset());

        // 默认消息类型为 PING
        String type = "PING";

        // 如果是 JSON 编码，尝试从 JSON 中提取 type 字段
//        if (encodingType == TcpEncodingType.JSON) {
//            try {
//                JsonNode root = MAPPER.readTree(payloadStr);
//                if (root.has("type") && root.get("type").isTextual()) {
//                    type = root.get("type").asText();
//                }
//            } catch (Exception e) {
//                // JSON 解析异常，默认使用 PING 类型
//            }
//        }

        DecodedMessage message = new DecodedMessage(magic, version, encoding, payloadStr, type);
        return message;
    }
}